/*
 * CommunicationDespacho.h
 *
 */

#ifndef COMMUNICATIONDESPACHO_H_
#define COMMUNICATIONDESPACHO_H_

#include <list>
#include "MiddlewareCommon.h"
#include "../IPC/MessageQueue.h"


namespace middleware {

class CommunicationDespacho
{
public:
	typedef enum{RETIRAR=0, NOTIFICAR_DESPACHO}DespachoRequestType;
	typedef enum{NOTIFICACION_CLIENTE=0, PRODUCTO,FIN_PRODUCTOS}DespachoReplyType;

	//For data alignment purposes (32/64 bit compatibility)
	#pragma pack(push, 1)

	struct DespachoRequestStruct
	{
		DespachoRequestType requestType;
		OrdenCompraHeader ordenCompra;
		ProductoCantidad producto;
	};

	struct DespachoReplyStruct
	{
		DespachoReplyType replyType;
		OrdenCompraHeader ordenCompra;
		ProductoCantidad producto;
	};

	struct EntregaProductoStruct
	{
		OrdenCompraHeader ordenCompra;
		Producto producto;
	};
	#pragma pack(pop)


typedef enum{SIDE_DESPACHO=0,ROBOT_16,CLIENTE,ADPT,UNDEFINED_TYPE}DespachoCommunicationType;

public:
	CommunicationDespacho(std::string hostName);
	virtual ~CommunicationDespacho();

	void getDespachoRequest(DespachoRequestType &requestType,
							   OrdenCompraHeader &ordenCompra,
							   ProductoCantidad &producto);

	void notificarDespachoOCLista(OrdenCompraHeader &ordenCompra,ProductoCantidad &producto);

	void retirarProducto(OrdenCompraHeader &ordenCompra,TipoProducto &tipoProducto, Producto &producto);

	void notificarCliente(OrdenCompraHeader &ordenCompra,ProductoCantidad &producto);

	void esperarNotificacion(int clientId);

	void entregarProducto(OrdenCompraHeader &ordenCompra,Producto &producto);

	static void launchForClient(std::string hostName, int clientId);

	//Creacion
	static void create(DespachoCommunicationType type, std::string hostName);

	static void destroy(DespachoCommunicationType type, std::string hostName);

private:
	int m_mTypeRequest;
	ipc::MessageQueue<DespachoRequestStruct> m_RequestQueue;
	ipc::MessageQueue<DespachoReplyStruct> m_ReplyQueue;
	ipc::MessageQueue<EntregaProductoStruct> m_EntregaQueue;
	static const Uid UIDDespachoRequest,UIDDespachoReply,UIDEntrega;
};

} /* namespace middleware */
#endif /* COMMUNICATIONDESPACHO_H_ */
